package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.AlunoBD;
import BD.TurmaAlunoDisciplinaBD;

public class TurmaAlunoDisciplinaDAO {
    
    //Conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();
    
    //Metodos unique, auto incremento, chave composta
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDTurmaAlunoBD;
    ResultSet rs;
    
    public List<AlunoBD> filtroAluno(String nomeCurso, String anoIngresso) {      
        List<AlunoBD> listaFiltro = new ArrayList(); 
        try { 
            Connection con = conBD.conectar();
            BDTurmaAlunoBD = con.createStatement();

            //recupera os dados da turma de acordo com o nome da turma
            rs = BDTurmaAlunoBD.executeQuery("SELECT a.ra_al, a.nome_al "
                    + " FROM aluno a, curso c "
                    + " WHERE a.cod_curso = c.cod_curso and "
                    + " c.nome_curso = '"+nomeCurso+"' and "
                    + " year(a.dataingresso_al) = '"+anoIngresso+"' ");
            
            if (rs != null) {                                
                    while (rs.next()) {
                        AlunoBD al = new AlunoBD();
                                               
                        //Seta os dados
                        al.setRa(rs.getInt("a.ra_al"));
                        al.setNome(rs.getString("a.nome_al"));
                        // add na lista
                        listaFiltro.add(al); 
                }
                con.close();
                return listaFiltro; 
          }else {
                con.close();
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }   
    
    public List<TurmaAlunoDisciplinaBD> filtroAlunoDis(String campo, String valor, String nomeTurma) {      
        List<TurmaAlunoDisciplinaBD> listaFiltro = new ArrayList(); 

        try { 

            Connection con = conBD.conectar();
            BDTurmaAlunoBD = con.createStatement();

            //recupera os dados do aluno de acordo com a disciplina
            rs = BDTurmaAlunoBD.executeQuery("SELECT a.ra_al, a.nome_al, ta.nota, ta.frequencia, ta.aprovado, ta.creditosdisciplina "
                    + " from aluno a, turmaalunodisciplina ta, turma t, disciplina d "
                    + " where a.ra_al = ta.ra_al and "
                    + " ta.cod_dis = d.cod_dis and "
                    + " t.cod_turma = ta.cod_turma and "
                    + " t.nome_turma = '"+nomeTurma+"' and "
                    + " "+campo+" = '"+valor+"' "
                    + " order by(a.nome_al) ");
            


            if (rs != null) {  
                
                    while (rs.next()) {
                       
                        TurmaAlunoDisciplinaBD tadb = new TurmaAlunoDisciplinaBD();
                                               
                        //Seta os dados
                        tadb.setRaAluno(rs.getInt("a.ra_al"));
                        tadb.setNomeAluno(rs.getString("a.nome_al"));
                        tadb.setNota(rs.getFloat("ta.nota"));
                        tadb.setFreq(rs.getFloat("ta.frequencia"));
                        tadb.setAprovado(rs.getBoolean("ta.aprovado"));
                        tadb.setCreditosDisciplina(rs.getInt("ta.creditosdisciplina"));
                        // add na lista
                        listaFiltro.add(tadb); 
                }
                con.close();
                return listaFiltro; 
          }else {

                con.close();
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }       
    
    public boolean inserirAluno(TurmaAlunoDisciplinaBD tabd){
        try
        {
           
            Connection con = conBD.conectar();
            BDTurmaAlunoBD = con.createStatement();  

            //resgatar codigo da turma, a partir do nome             
            rs = BDTurmaAlunoBD.executeQuery("SELECT cod_turma from turma where "
                    + "nome_turma = '"+tabd.getNomeTurma()+"' ");
            rs.last();
            int capturaTurma = rs.getInt("cod_turma");
            

            
            //resgatar codigo da disciplina, a partir do nome
            rs = BDTurmaAlunoBD.executeQuery("SELECT cod_dis from disciplina "
                    + "where nome_dis = '"+tabd.getNomeDisciplina()+"' ");
            rs.last();
            int capturaDisciplina = rs.getInt("cod_dis");
            
            //verificar as chaves compostas
            if(metBD.verificarChaveComposta("turmaalunodisciplina", 
                    "cod_turma", String.valueOf(capturaTurma), 
                    "cod_dis", String.valueOf(capturaDisciplina),
                    "ra_al", String.valueOf(tabd.getRaAluno()))){

                    int aprovacao;

                    if(tabd.isAprovado())
                        aprovacao = 1;
                    else
                        aprovacao = 0;

                //Inserirndo no Banco de Dados
                BDTurmaAlunoBD.execute("INSERT INTO turmaalunodisciplina VALUES('"+capturaTurma+"',"
                        + " '" + capturaDisciplina + "','"+tabd.getRaAluno()+"', '"+tabd.getNota()+"', "
                        + "'"+tabd.getFreq()+"','"+aprovacao+"','"+tabd.getCreditosDisciplina()+"');");
                
                
              //Mensagem de OK
                JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso",
                "Cadastro", JOptionPane.INFORMATION_MESSAGE);
                
                //Fechando conexão
                con.close();
                return true;
            }
            else{
                //Mensagem de erro
                JOptionPane.showMessageDialog(null,"Aluno já foi cadastrado para"
                        + " esta disciplina", 
                "Aluno já existe", JOptionPane.ERROR_MESSAGE);
                
                //Fechando conexão
                con.close();
                return false;
            }
        }
        catch (SQLException ex) {
            System.out.println(ex);
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco",
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }         
        return false;
    }        
    
    public boolean excluirAluno(TurmaAlunoDisciplinaBD tabd){
        String sql = "delete from turmaalunodisciplina where ra_al = ? and "
                + " cod_turma = ? and cod_dis = ?";   
              
        try {
            Connection con = conBD.conectar();
            BDTurmaAlunoBD = con.createStatement(); 
                                      
            //resgatar codigo da turma, a partir do nome             
            rs = BDTurmaAlunoBD.executeQuery("SELECT cod_turma from turma where "
                    + "nome_turma = '"+tabd.getNomeTurma()+"' ");
            rs.last();
            int capturaTurma = rs.getInt("cod_turma");
            
            //resgatar codigo da disciplina, a partir do nome
            rs = BDTurmaAlunoBD.executeQuery("SELECT cod_dis from disciplina "
                    + "where nome_dis = '"+tabd.getNomeDisciplina()+"' ");
            rs.last();
            int capturaDisciplina = rs.getInt("cod_dis");

            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, (String.valueOf(tabd.getRaAluno())));
            ps.setString(2, (String.valueOf(capturaTurma)));
            ps.setString(3, (String.valueOf(capturaDisciplina)));
            
            if (ps.executeUpdate() > 0) {
                con.close();
                return true;
            } else {
                con.close();
                return false;
            }               
            
        } catch (SQLException e) {
             JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
   }
    
    public boolean salvarNota(float nota, float frequencia, boolean aprovado, int creditosdisciplina,int ra, String turma, String disciplina){
        String sql = "update turmaalunodisciplina set nota = ?, frequencia = ?, aprovado = ?, creditosdisciplina = ?"
                + " where ra_al = ? and cod_turma = ? and cod_dis = ?";                 
        try {
            Connection con = conBD.conectar();
            BDTurmaAlunoBD = con.createStatement(); 
                                      
            //resgatar codigo da turma, a partir do nome             
            rs = BDTurmaAlunoBD.executeQuery("SELECT cod_turma from turma where "
                    + "nome_turma = '"+turma+"' ");
            rs.last();
            int capturaTurma = rs.getInt("cod_turma");
            
            //resgatar codigo da disciplina, a partir do nome
            rs = BDTurmaAlunoBD.executeQuery("SELECT cod_dis from disciplina "
                    + "where nome_dis = '"+disciplina+"' ");
            rs.last();
            int capturaDisciplina = rs.getInt("cod_dis");
            int aprovacao;
            
            if(aprovado)
                aprovacao = 1;
            else
                aprovacao = 0;
           
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, (String.valueOf(nota)));
            ps.setString(2, (String.valueOf(frequencia)));
            ps.setString(3, (String.valueOf(aprovacao)));
            ps.setString(4, (String.valueOf(creditosdisciplina)));
            ps.setString(5, (String.valueOf(ra)));
            ps.setString(6, (String.valueOf(capturaTurma)));
            ps.setString(7, (String.valueOf(capturaDisciplina)));
            

            
            if (ps.executeUpdate() > 0) {
                con.close();
                return true;
            } else {
                con.close();
                return false;
            }               
            
        } catch (SQLException e) {
             JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
   }
    
    public int capturarCreditosDisciplina(String nomeDisciplina){
            try{
            Connection con = conBD.conectar();
            BDTurmaAlunoBD = con.createStatement();  

            //resgatar codigo da turma, a partir do nome             
            rs = BDTurmaAlunoBD.executeQuery("SELECT credito_dis from disciplina where "
                    + "nome_dis = '"+nomeDisciplina+"' ");
            rs.last();
            int capturaCreditos = rs.getInt("credito_dis");
            return capturaCreditos;
            }
            catch (SQLException e) {
             JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return 0;
        }
    }
}
